package nusar

class UsuarioController {

	static defaultAction = "login"
	
//	def springSecurityService
	
	def autenticar(){
	
		boolean paramsOK = true
		
		// Verificamos que se hayan revisido los parametros necesarios
		if(params.username == "")
		{
			flash.message="<div id=\"error\">El campo del usuario esta vacio.</div>"
			paramsOK = false
		}
		else if(params.password == "")
		{
			flash.message="<div id=\"error\">El campo del password esta vacio.</div>"
			paramsOK = false
		}
		
		// Encriptamos el password antes de mandarlo al servidor de la UABC
	//	String codificado = springSecurityService.encodePassword(params.password, null)
		
	//	println "Password codificado: " + codificado
		
		// Si hubo errores con los parametros, regresamos a la vista Login
		if(!paramsOK) 	
		{
			redirect(controller: "usuario", action: "login")
			return
		}
		
		// Conectarse con la BD de la UABC para comprobar que el correo existe
		String[] infoUsuario = UABCService.validarDatos(params.username, params.password /*codificado*/)
		
		// En caso de que no exista, mostrar un mensaje de error
		if(!infoUsuario)
		{
			flash.message="<div id=\"error\">Problemas al conectarse con el servidor.</div>"
			
			redirect(controller: "usuario", action: "login")
		}
		else if(infoUsuario[0].equalsIgnoreCase("Error"))
		{
			flash.message="<div id=\"error\">La informacion que proporcionaste no es correcta.</div>"
			
			redirect(controller: "usuario", action: "login")
		}
		else
		{
			// Si existen, se obtiene toda la informacion del usuario
			def usuario = UABCService.getUsuario(infoUsuario[0], infoUsuario[1])
			
			// Se crea la sesion del usuario
			session.user = usuario
			
			// Se checa si es necesario guardar informacion en nuestra BD
			verificarBD(infoUsuario[0])
			
			// Se redirecciona segun sea alumno o coordinador
			redirect(controller: infoUsuario[0], action: "principal")
		}
	}
	
	
	/*
	 * Verifica si la BD de nuestro sistema cuenta con la informacion
	 * necesaria para poder crear las solicitudes
	 */   	 
	def verificarBD(String tipoUsuario){
	
		//Verificamos que tengas las mismas materias que en el servidor de la UABC
		println "Numero de materias: " + UABCService.getNumMaterias()
		if(Materia.count() < UABCService.getNumMaterias())
			guardarMaterias()
			
			
		// Para un alumno
		if(tipoUsuario.equalsIgnoreCase("Alumno"))
		{
		    // Checamos si ya esta la informacion del alumno en la BD
			if(!Alumno.get(session.user.infoAlumno.matricula))
			{
	            /*
	             * Antes de guardar la informacion del alumno, debemos verificar
	             * que haya un coordinador registrado para la carrera del alumno,
	             * ya que su informacion se necesita para llenar la solicitud.
	             */
				 def carrera = session.user.infoAlumno.carrera
	             def coordinador = Coordinador.findByCarrera(carrera)   
	             
	             // Si no hay datos del coordinador, debemos guardarlos
	             if(!coordinador)      
	             {
					 guardarCoordinador(session.user.infoAlumno.coordinador)
	             }
                 
				 // Se guarda la informacion del alumno         
				 guardarAlumno()
			}
		}
		else
		{
			if(!Coordinador.get(session.user.numTrabajador))
				guardarCoordinador(session.user)
		}
  }
  
  
  
	def guardarAlumno(){
		
		def infoAlumno = session.user.infoAlumno
		
		// Informacion del alumno
		def alumno = new Alumno(matricula:	infoAlumno.matricula,
				   nombre:		infoAlumno.nombre,
				   carrera:		infoAlumno.carrera,
				   coordinador: Coordinador.get(infoAlumno.coordinador.numTrabajador),
				   solicitudesEnviadas: 0
				   )
		
		// Salvamos y checamos si hubo errores
		if( !alumno.save(flush:true) ) {
			alumno.errors.each {
				println it
			}
		}
	}
	
	
	def guardarCoordinador(def infoCoordinador){
		
		// Informacion del coordinador
		def coordinador = new Coordinador(numTrabajador: infoCoordinador.numTrabajador,
										  nombre: infoCoordinador.nombre,
										  carrera: infoCoordinador.carrera)
		
		// Salvamos y checamos si hubo errores
		if( !coordinador.save(flush:true) ) {
			coordinador.errors.each {
				println it
			}
		}
	}
	
	
	def guardarMaterias(){
		
		// Obtenemos todas las materias del servidor de la UABC
		HashMap materias = UABCService.getAllMaterias()
		
		for(Object x : materias.keySet())
		{
			println "Id Materia: " + x
			
			// Si la materia no se encuentra en nuestra BD, la guardamos
			if(!Materia.get(x))
			{
				println "La materia: " + materias[x].nombre + " no esta en nuestra BD."
				
				def asignatura = new Materia(iden: x,
											 nombre: materias[x].nombre,
											 grupo:	materias[x].grupo,
											 subgrupo: materias[x].subgrupo,
											 tipo: materias[x].tipo,
											 demanda: 0)
				
				// Salvamos y checamos si hubo errores
				if( !asignatura.save(flush:true) ) {
					asignatura.errors.each {
						println it
					}
				}
			}
		}
	}
	
	def login(){}
}
